package cn.android666.audiorecorder.objectpool

import org.apache.commons.pool2.PooledObjectFactory
import org.apache.commons.pool2.impl.GenericObjectPool
   import org.apache.commons.pool2.impl.GenericObjectPoolConfig
   import timber.log.Timber
   import java.nio.ByteBuffer
/** ByteBuffer对象池 */
class ByteBufferPool(
    bufferSize: Int,
    private val name: String,
    maxTotal: Int = 3,
    maxIdle: Int = 3,
    minIdle: Int = 3,
    factory: PooledObjectFactory<ByteBuffer> = ByteBufferFactory(bufferSize),
    config: GenericObjectPoolConfig<ByteBuffer> = GenericObjectPoolConfig<ByteBuffer>().apply { jmxEnabled = false }
) : GenericObjectPool<ByteBuffer>(factory, config) {

    init {
        this.maxTotal = maxTotal        // 表示最大可以创建的对象数量，比如设置为5，则当创建了5个对象，且都借出去了，再借时就会返回null。
        this.maxIdle = maxIdle          // 表示创建对象还回池里时，池里最多可以有的对象数量，如果超过这个数量的将会被回收。比如设置最大空闲为3，还了4个对象到池里，则将有一个会被回收掉。
        this.minIdle = minIdle          // 在调用preparePool()函数时此参数有用，比如minIdle设置为3，则调用preparePool()时会立马创建出3个对象，并不是说随时要保持有3个空闲对象，只是在调用preparePool()时如果空闲对象不够指定的数量时才会创建
        this.blockWhenExhausted = false // 设置为false，则当借用对象时，如果池里已经没有对象了，则不要阻塞借对象的函数（此时借对象时会直接抛出异常）
        this.preparePool()
    }

    override fun borrowObject(): ByteBuffer? {
        return try {
            super.borrowObject()
        } catch (e: Exception) {
            // 没有可用对象可借时会抛出异常
            Timber.e("${name}无可借对象了！")
            null
        }
    }

    override fun returnObject(obj: ByteBuffer?) {
        try {
            super.returnObject(obj)
        } catch (e: Exception) {
            // 当一个对象借出一次，然后连还回来两次时就会抛出异常
            Timber.e("${name}还对象时出现异常：${e.javaClass.simpleName}：${e.message}")
        }
    }
}